home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
PROGRAMM
/
DB_CLIPP
/
H245.ZIP
/
NFSRC21.ZIP
/
AMEDIAN.PRG
< prev
next >
Wrap
Text File
|
1991-08-16
|
4KB
|
139 lines
/*
* File......: AMedian.Prg
* Author....: Ralph Oliver, TRANSCOM SYSTEMS
* CIS ID....: 74030,703
* Date......: $Date: 15 Aug 1991 23:05:22 $
* Revision..: $Revision: 1.1 $
* Log file..: $Logfile: E:/nanfor/src/amedian.prv $
*
* This is an original work by Ralph Oliver and is placed in the
* public domain.
*
* This program uses the preprocessor #defines and #command in
* Aavg.prg by David Husnian.
*
* Modification history:
* ---------------------
*
* $Log: E:/nanfor/src/amedian.prv $
*
* Rev 1.1 15 Aug 1991 23:05:22 GLENN
* Forest Belt proofread/edited/cleaned up doc
*
* Rev 1.0 07 Jun 1991 23:03:20 GLENN
* Initial revision.
*
*/
/* $DOC$
* $FUNCNAME$
* FT_AMEDIAN()
* $CATEGORY$
* Array
* $ONELINER$
* Find middle value in array, or average of two middle values
* $SYNTAX$
* FT_AMEDIAN( <aArray> [, <nStart> [, <nEnd> ] ] )
* -> nMedian
* $ARGUMENTS$
* <aArray> is the array containing the elements to be averaged.
*
* <nStart> is the first array element to include,
* defaults to first element.
*
* <nEnd> is the last array element to include,
* defaults to last element.
* $RETURNS$
* The median average of the array elements
* $DESCRIPTION$
* This function sorts the elements of a numeric array and
* then returns the value in the middle element of the sorted
* array. If there is no exact middle value, then it returns
* the average of the two middle values. Half of the elements
* are > median and half are < median. A median average may
* more reflect a more useful average when there are extreme
* values in the set.
* $EXAMPLES$
* FT_AMEDIAN( aArray ) // Return Median for entire array
*
* FT_AMEDIAN( aArray, 2) // Return Median for elements from 2 to end
*
* FT_AMEDIAN( aArray, ,9) // Return Median for 1st 9 elements
*
* FT_AMEDIAN( aArray,8,40 ) // Return Median for elements 8 to 40
* $END$
*/
#ifdef FT_TEST
#include "directry.ch"
FUNCTION MAIN()
LOCAL var0, myarray0 := DIRECTORY(), myarray1 := {}
CLS
? "TEST TO DEMONSTRATE EXAMPLES OF FT_AMEDIAN"
?
AEVAL( myarray0, { |x| AADD( myarray1, x[ F_SIZE ]) } )
var0 := FT_AMEDIAN( myarray1 )
? PADR('FT_AMEDIAN( myarray1 ) ->',35)
?? var0
?
var0 := FT_AMEDIAN( myarray1, 2 )
? PADR('FT_AMEDIAN( myarray1, 2 ) ->',35)
?? var0
?
var0 := FT_AMEDIAN( myarray1, , 9 )
? PADR('FT_AMEDIAN( myarray1, , 9 ) ->',35)
?? var0
?
var0 := FT_AMEDIAN( myarray1, 8, 40 )
? PADR('FT_AMEDIAN( myarray1, 8, 40 ) ->',35)
?? var0
?
RETURN NIL
#endif
#define FORCE_BETWEEN(x,y,z) (y := MAX(MIN(y,z),x))
#command DEFAULT <Param1> TO <Def1> [, <ParamN> TO <DefN> ] ;
=> ;
<Param1> := IF(<Param1> == NIL,<Def1>,<Param1>) ;
[; <ParamN> := IF(<ParamN> == NIL,<DefN>,<ParamN>)]
FUNCTION FT_AMEDIAN( aArray, nStart, nEnd )
LOCAL nTemplen, aTemparray, nMiddle1, nMiddle2, nMedian
DEFAULT nStart TO 1, ;
nEnd TO LEN( aArray )
// Make Sure Bounds are in Range
FORCE_BETWEEN(1, nEnd, LEN( aArray ))
FORCE_BETWEEN(1, nStart, nEnd)
// Length of aTemparray
nTemplen := ( nEnd - nStart ) + 1
// Initialize aTemparray
aTemparray := ACOPY( aArray, ARRAY( nTemplen ), nStart, nTemplen )
// Sort aTemparray
aTemparray := ASORT( aTemparray )
// Determine middle value(s)
IF ( nTemplen % 2 ) == 0
nMiddle1 := aTemparray[ (nTemplen / 2) ]
nMiddle2 := aTemparray[ INT(nTemplen / 2) +1 ]
nMedian := INT( ( nMIddle1 + nMiddle2 ) / 2 )
ELSE
nMedian := aTemparray[ INT( nTemplen / 2 ) + 1 ]
ENDIF
RETURN ( nMedian )